package cn.com.project.proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * CGLIB代理类 调用处理器
 */
public class CglibProxy implements MethodInterceptor {

    private Object target ; // 需要代理的目标对象

    public CglibProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("CGLIB动态代理，开始！");
        Object invoke = method.invoke(target, objects); // 方法执行，参数：target 目标对象 objects 参数数组
        System.out.println("CGLIB动态代理，结束！");
        return invoke;
    }

    /**
     * 获取代理对象方法
     * @return
     */
    public Object getCglibProxy(){
        Enhancer enhancer = new Enhancer();
        // 设置父类,因为 CGLIB 是针对指定的类生成一个子类，所以需要指定父类
        enhancer.setSuperclass(target.getClass());
        enhancer.setCallback(this); // 设置回调
        Object result = enhancer.create(); // 创建并返回代理对象
        return result;
    }

    public static void main(String[] args) {
        CglibProxy cglib = new CglibProxy(new UserServiceImpl());
        // 获取代理对象
        UserService user =  (UserService)cglib.getCglibProxy();
        user.printUserName(1L); //执行方法
    }
}
